package com.example.play_car

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.bw.common.base.BaseViewModel
import com.example.common.Constants
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import okhttp3.OkHttpClient
import okhttp3.Request
import org.json.JSONArray
import org.json.JSONObject

/**
 * 主页帖子列表的ViewModel，负责数据请求和解析
 */
class PlayCarViewModel : BaseViewModel() {
    // 帖子列表LiveData，界面层通过观察它来刷新内容
    val posts = MutableLiveData<List<Post>>()
    // 错误信息LiveData，界面层通过观察它来弹出提示
    val errorMsg = MutableLiveData<String>()

    /**
     * 加载帖子数据
     * @param category 分类（2=热门，0=帖子）
     * @param ifFocus 是否只看关注（1=只看关注，0=全部）
     * @param keyword 搜索关键字
     * @param pageNum 页码
     * @param pageSize 每页数量
     */
    fun loadPosts(
        category: Int,
        ifFocus: Int,
        keyword: String,
        pageNum: Int,
        pageSize: Int
    ) {
        // 启动协程进行网络请求
        viewModelScope.launch(Dispatchers.IO) {
            try {
                // 构建请求URL
                val urlBuilder = StringBuilder(Constants.BASE_URL)
                urlBuilder.append(Constants.POSTS_PATH)
                urlBuilder.append("?category=$category&pageNum=$pageNum&pageSize=$pageSize")
                if (ifFocus == 1) urlBuilder.append("&ifFocus=1")
                if (keyword.isNotEmpty()) urlBuilder.append("&content=${keyword}")

                // 创建并执行OkHttp请求
                val request = Request.Builder().url(urlBuilder.toString()).build()
                val response = OkHttpClient().newCall(request).execute()
                val json = response.body?.string() ?: ""
                // 解析返回的json数据
                val list = parsePosts(json)
                // 切换到主线程，更新LiveData
                posts.postValue(list)
            } catch (e: Exception) {
                // 网络或解析异常，通知界面层
                errorMsg.postValue("加载失败: ${e.message}")
            }
        }
    }

    /**
     * 解析接口返回的json字符串，提取帖子列表
     * @param json 接口返回的原始json字符串
     * @return 帖子数据列表
     */
    private fun parsePosts(json: String): List<Post> {
        val result = mutableListOf<Post>()
        try {
            val obj = JSONObject(json)
            // 取出data对象
            val dataObj = obj.optJSONObject("data") ?: return result
            // 取出records数组
            val recordsArr: JSONArray = dataObj.optJSONArray("records") ?: JSONArray()
            for (i in 0 until recordsArr.length()) {
                val item = recordsArr.getJSONObject(i)
                // 解析图片/视频列表
                val images = mutableListOf<String>()
                val imgArr = item.optJSONArray("img") ?: JSONArray()
                for (j in 0 until imgArr.length()) {
                    val imgObj = imgArr.getJSONObject(j)
                    val url = imgObj.optString("url")
                    if (url.isNotEmpty()) images.add(url)
                    // 不要再加 firstImage
                }
                // 构造Post对象并加入结果列表
                result.add(
                    Post(
                        id = item.optString("postsId"),
                        nickname = item.optString("nickName"),
                        avatar = item.optString("avatar"), // 头像
                        content = item.optString("content"),
                        images = images,
                        likeCount = item.optInt("likeNumber"),
                        commentCount = item.optInt("commentNumber")
                    )
                )
            }
        } catch (_: Exception) { }
        return result
    }
}